package study.activiti.e_historyQuery;

import java.util.List;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.history.HistoricActivityInstance;
import org.activiti.engine.history.HistoricProcessInstance;
import org.activiti.engine.history.HistoricTaskInstance;
import org.activiti.engine.history.HistoricVariableInstance;
import org.apache.commons.lang3.StringUtils;
import org.junit.Test;

/**  
 * @Name: ProcessVariablesTest
 * @Description: 流程执行历史记录查询测试类
 * @Author: 李超
 * @Create Date: 2016-12-14
 */
public class HistoryQueryTest {
	
	//流程引擎
	private ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine() ;
		
	/**  
	* @Name: queryHistoricProcessInstance（方法的名称）
	* @Description: 查询历史流程实例（方法的描述）
	* @Author: 李超（作者）
	* @Version: V1.00 （版本号）
	* @Create Date: 2016-12-11 （创建日期）
	* @Parameters: 无（方法的入参，如果没有，填写为“无”）
	* @Return: 无（返回值，如果没有，填写为“无”）
	*/
	@Test
	public void queryHistoricProcessInstance() {
		//流程实例id
		String processInstanceId = "62501" ;
		List<HistoricProcessInstance> list = processEngine.getHistoryService()
					 .createHistoricProcessInstanceQuery() //创建历史流程实例查询对象
					 .processInstanceId(processInstanceId) //根据流程实例id进行查询
					 .orderByProcessInstanceStartTime().desc() //按照流程实例创建时间降序排列
					 .list() ; //返回结果集合
		if(list != null && list.size() > 0) {
			for (HistoricProcessInstance hpi : list) {
				System.out.println("流程实例id:" + hpi.getId());
				System.out.println("流程定义id:" + hpi.getProcessDefinitionId());
				System.out.println("流程开始执行时间:" + hpi.getStartTime());
				System.out.println("流程结束执行时间:" + hpi.getEndTime());
				System.out.println("流程执行时间:" + hpi.getDurationInMillis());
			}
		}
	}
	
	/**  
	* @Name: queryHistoricActivitiInstance（方法的名称）
	* @Description: 查询历史流程活动实例：查询某一次流程的执行所经历过的活动节点（方法的描述）
	* @Author: 李超（作者）
	* @Version: V1.00 （版本号）
	* @Create Date: 2016-12-11 （创建日期）
	* @Parameters: 无（方法的入参，如果没有，填写为“无”）
	* @Return: 无（返回值，如果没有，填写为“无”）
	*/
	@Test
	public void queryHistoricActivitiInstance() {
		//流程实例id
		String processInstanceId = "62501" ;
		List<HistoricActivityInstance> list = processEngine.getHistoryService()
					 .createHistoricActivityInstanceQuery() //创建历史活动实例查询对象
					 .processInstanceId(processInstanceId) //根据流程实例id查询
					 .orderByHistoricActivityInstanceStartTime().asc() //按照活动实例创建时间升序排列
					 .list() ; //返回结果列表
		if(list != null && list.size() > 0) {
			for (HistoricActivityInstance hai : list) {
				System.out.println("历史活动实例id:" + hai.getId());
				System.out.println("流程实例id:" + hai.getProcessInstanceId());
				System.out.println("活动节点id:" + hai.getActivityId());
				System.out.println("活动节点名称:" + hai.getActivityName());
				if(StringUtils.isNoneBlank(hai.getAssignee())) {
					System.out.println("活动节点办理人:" + hai.getAssignee());
				}
				System.out.println("活动节点开始时间:" + hai.getStartTime());
				System.out.println("活动节点结束时间:" + hai.getEndTime());
				System.out.println("活动节点执行时间:" + hai.getDurationInMillis());
				System.out.println("###########################################");
			}
		}
	}	
	
	/**  
	* @Name: queryHistoricTask（方法的名称）
	* @Description: 查询历史流程任务实例：查询某一次流程的执行所经历过的任务节点（方法的描述）
	* @Author: 李超（作者）
	* @Version: V1.00 （版本号）
	* @Create Date: 2016-12-11 （创建日期）
	* @Parameters: 无（方法的入参，如果没有，填写为“无”）
	* @Return: 无（返回值，如果没有，填写为“无”）
	*/
	@Test
	public void queryHistoricTask() {
		//流程实例id
		String processInstanceId = "27501" ;
		List<HistoricTaskInstance> list = processEngine.getHistoryService()
					 .createHistoricTaskInstanceQuery()
					 .processInstanceId(processInstanceId)
					 .orderByHistoricTaskInstanceStartTime().asc()
					 .list() ;
		if(list != null && list.size() > 0) {
			for (HistoricTaskInstance hti : list) {
				System.out.println("历史任务实例id:" + hti.getId());
				System.out.println("流程实例id:" + hti.getProcessInstanceId());
				System.out.println("任务id:" + hti.getTaskDefinitionKey());
				System.out.println("任务名称:" + hti.getName());
				System.out.println("任务办理人:" + hti.getAssignee());
				System.out.println("任务开始时间:" + hti.getStartTime());
				System.out.println("任务结束时间:" + hti.getEndTime());
				System.out.println("任务执行时间:" + hti.getDurationInMillis());
				System.out.println("####################################");
			}
		}
	}
	
	/**  
	* @Name: queryHistoricVariables（方法的名称）
	* @Description: 查询历史流程变量：查询某一次流程执行时设置的流程变量（方法的描述）
	* @Author: 李超（作者）
	* @Version: V1.00 （版本号）
	* @Create Date: 2016-12-14 （创建日期）
	* @Parameters: 无（方法的入参，如果没有，填写为“无”）
	* @Return: 无（返回值，如果没有，填写为“无”）
	*/
	@Test
	public void queryHistoricVariables() {
		//流程实例id
		String processInstanceId = "42501" ;
		List<HistoricVariableInstance> list = processEngine.getHistoryService()
					 .createHistoricVariableInstanceQuery() //创建历史流程变量查询对象
					 .processInstanceId(processInstanceId) //根据流程实例id查询
					 .list() ; //返回结果列表
		if(list != null && list.size() > 0) {
			for (HistoricVariableInstance hvi : list) {
				System.out.println("流程实例id:" + processInstanceId);
				System.out.println("流程变量名称:" + hvi.getVariableName());
				System.out.println("流程变量类型:" + hvi.getVariableTypeName()); 
				System.out.println("流程变量内容:" + hvi.getValue());
				System.out.println("######################################");
			}
		}
	}

}
